package com.ant.backstage.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Author zhangyu
 * @Description
 * @Date 16:52 2021/12/28
 * @Param 接口文档配置类
 * @return
 **/
@Configuration
@EnableSwagger2
@EnableKnife4j//swagger增强开启注解
public class SwaggerConfig {

        public static final String BASE_PACKAGE = "com.ant.backstage";//需要扫描的包

        @Value("${swagger.enableSwagger}")
        private Boolean enableSwagger ;

        @Bean
        public Docket createRestApi() {
            //添加head参数start
            ParameterBuilder tokenPar = new ParameterBuilder();
            List<springfox.documentation.service.Parameter> operationParameters = new ArrayList<>();
            tokenPar.name("Authorization").description("JWT").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
            operationParameters.add(tokenPar.build());
            //添加head参数end
            return new Docket(DocumentationType.SWAGGER_2)
                    //将Timestamp类型全部转为Long类型
                    .directModelSubstitute(Timestamp.class, Long.class)
                    //分分组名称
                    .groupName("WEB")
                    //将Date类型全部转为Long类型
                    .directModelSubstitute(Date.class, Long.class)
                    //  //全局参数
                    .globalOperationParameters(operationParameters)
                    .apiInfo(apiInfo())
                    // 生产环境的时候关闭 swagger 比较安全
                    .enable(enableSwagger)
                    .select()
                    /*
                     * RequestHandlerSelectors 可使用的扫描条件：
                     *    basePackage() --- 只扫描指定路径上的类
                     *    any() --- 扫描所有类
                     *    withClassAnnotation() --- 通过判断类上的注解中有xxx注解扫描类
                     *    withMethodAnnotation() --- 通过判断方法上的注解中有xxx注解扫描方法
                     * */
                    .apis(RequestHandlerSelectors.basePackage(BASE_PACKAGE+".controller"))//拼接该模块最后一级目录
                    /*
                     * PathSelectors 可使用的 mapperHandler 路径匹配的方法：扫描匹配成功的路径，生成API
                     *    any() --- 匹配所有的路径
                     *    ant() --- 匹配传入参数的路径
                     *    regex() --- 通过正则表达式匹配路径
                     *  any（）需要注意表明是post还是Git还是put类型的请求，只RequestMapping注解会生成，get/put/post/del等多个接口展示
                     * */
                    .paths(PathSelectors.any())
                    .build();
        }

        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("接口文档")
                    .description("WEB API")
                    .termsOfServiceUrl("localhost:8080")
                    .contact(new Contact("ZHANGYU", "/index.html", "2470838639@qq.com"))
                    .version("1.0")
                    .build();
        }


  /*
    https://www.jianshu.com/p/4ccad4e89774
   //全局参数配置     也可以单独配置多个全局参数
    private List<springfox.documentation.service.Parameter> getGlobalOperationParameters() {
        List<springfox.documentation.service.Parameter> pars = new ArrayList<>();
        ParameterBuilder parameterBuilder = new ParameterBuilder();

        // header query cookie
        parameterBuilder.name("token").description("令牌").modelRef(new ModelRef("string")).parameterType("header").required(false);
        pars.add(parameterBuilder.build());
        parameterBuilder.name("userId").description("用户id").modelRef(new ModelRef("int")).parameterType("query").required(false);
        pars.add(parameterBuilder.build());
        parameterBuilder.name("name").description("用户名").modelRef(new ModelRef("string")).parameterType("cookie").required(false);
        pars.add(parameterBuilder.build());
        return pars;
    }


    //全站统一参数配置，一般是token。
    private  List<ApiKey> authToken() {
        List<ApiKey> arrayList = new ArrayList();
        arrayList.add(new ApiKey("token", "token", "header"));
        return arrayList;
    }

    */

    /**
     *   问题： service-worker.js 404错误
     *   Knif4j 可以更换为2.0.3版本或者更高的版本
     *  https://blog.csdn.net/vdora/article/details/115705055
     **/



}
